{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "面试官想从这道题中考察面试人什么？\n",
    "这个问题是针对 Django 的处理请求部分，也就是和 URL 路由相关的问题。本身 Django 就是处理 request 和 reponse 的一种框架，那么它是怎么处理的，流程是怎样的？这些问题不清楚，怎么更好地使用 Django 呢？\n",
    "\n",
    "答案\n",
    "当用户在浏览器中输入 url 时，浏览器会生成请求头 (request head) 和请求体 (request body) 发给服务端。请求头和请求体中会包含浏览器的动作 (action)，这个动作通常为 GET 或者 POST；\n",
    "url 经过 Django 中的 wsgi，再经过 Django 的中间件，最后 url 到过路由映射表。Django 确定使用根 URLconf 模块。通常，这是 ROOT_URLCONF 设置的值，但如果传入 HttpRequest 对象拥有 urlconf 属性（通过中间件设置），它的值将被用来代替 ROOT_URLCONF 设置；\n",
    "Django 加载该 Python 模块并寻找可用的 urlpatterns 。它是 django.urls.path() 和 (或) django.urls.re_path() 实例的序列；\n",
    "Django 依次匹配每个 URL 模式，在与请求的 URL 匹配的第一个模式停下来；\n",
    "视图函数根据客户端的请求查询相应的数据返回给 Django，然后 Django 把客户端想要的数据做为一个字符串返回给客户端。客户端浏览器接收到返回的数据，经过渲染后显示给用户；\n",
    "如果没有 URL 被匹配，或者匹配过程中出现了异常，Django 会调用一个适当的错误处理视图。\n",
    "拓展\n",
    "URL 是 Web 服务的入口，用户通过浏览器发送过来的任何请求，都是发送到一个指定的 URL 地址，然后被响应。\n",
    "\n",
    "在 Django 项目中，我们使用 urls.py 去定义 URL 路由映射，另外，在每一级 APP 下又有它们独立的 urls.py。\n",
    "图片描述\n",
    "下面我们看看，在处理 request 和 reponse 的过程中，中间件 Middleware 的作用是什么？\n",
    "\n",
    "一个 HTTP 请求，首先被转化成一个 HttpRequest 对象，然后该对象被传递给 Request Middleware 处理，如果它返回了 HttpResponse 对象，则直接传递给 Response Middleware 做收尾处理。\n",
    "\n",
    "否则的话 Request Middleware 将访问 URL 配置，即从 urls.py 中读取，确定目标 view 来处理 HttpRequest 对象，在确定了 view 但是还没有执行时候，系统会把 HttpRequest 对象传递给 View Middleware 进行处理，如果它返回了 HttpResponse 对象，那么该 HttpResponse 对象将被传递给 Response Middleware 进行后续处理，否则将执行确定的 view 函数处理并返回 HttpResponse 对象，在整个过程中如果引发了异常并抛出，会被 Exception Middleware 进行处理。\n",
    "\n",
    "在整个过程中，Middleware 几乎贯穿在客户端和视图中间段的任何地方，它能够介入 Django 的请求和响应过程，在全局修改 Django 的输入和输出内容。\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
